#include<stdio.h>
#include<stdlib.h>
#include "queue.h"

static void CopyToNode(Item item, Node *pn);
static void CopyToItem(Node *pn, Item *pi);
void InitQ(Queue *pq){
	pq->front = pq->rear = NULL;
	pq->items = 0;
}
bool QFull(const Queue *pq){
	return pq->items == MAXQUEUE;
}
bool QEmpty(const Queue *pq){
	return pq->items == 0;
}
int QItemCount(const Queue *pq){
	return pq->items;
}
bool EnQ(Item item, Queue *pq){
	Node *pnew;
	if(QFull(pq))return false;
	pnew = (Node*)malloc(sizeof(Node));
	if(pnew == NULL){
		fprintf(stderr,"Unable to allocate memory!\n");
		exit(1);
	}
	CopyToNode(item, pnew);
	pnew->next = NULL;
	if(QEmpty(pq))pq->front = pnew;
	else pq->rear->next = pnew;
	pq->rear = pnew;
	pq->items++;
	return true;
}

bool DeQ(Item *pitem, Queue *pq){
	Node *pt;
	if(QEmpty(pq))return false;
	CopyToItem(pq->front, pitem);
	pt = pq->front;
	pq->front = pq->front->next;
	free(pt);
	pq->items--;
	if(pq->items == 0)pq->rear==NULL;
	return true;
}
void FreeQ(Queue *pq){
	Item dummy;
	while(!QEmpty(pq))DeQ(&dummy,pq);
}
static void CopyToNode(Item item, Node *pn){
	pn->item = item;
}
static void CopyToItem(Node *pn, Item *pi){
	*pi = pn->item;
}
